package com.dfbz.demo03_Constructor;

import com.dfbz.demo02_Class.Cate;
import org.junit.Test;

import java.lang.reflect.Constructor;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo01_反射获取类的构造方法 {

    @Test
    public void test1() throws NoSuchMethodException {
        // 获取字节码对象
        Class<Cate> cateClass = Cate.class;

        // 获取构造方法:获取空参构造
        Constructor<Cate> constructor = cateClass.getConstructor();

        System.out.println(constructor);
    }

    // 获取有参数的构造方法
    @Test
    public void test2() throws NoSuchMethodException {
        // 获取字节码对象
        Class<Cate> cateClass = Cate.class;

        // 根据参数列表获取构造方法
        Constructor<Cate> constructor = cateClass.getConstructor(String.class,String.class,Boolean.class);

        System.out.println(constructor);
    }


    @Test
    public void test3() throws NoSuchMethodException {
        // 获取字节码对象
        Class<Cate> cateClass = Cate.class;

        // 默认情况下getConstructor只能获取public修饰的方法,如果要获取其他的权限修饰符修饰的构造方法
        // getDeclaredConstructor可以获取任意权限修饰符修饰的构造方法,包括public修饰的
//        Constructor<Cate> constructor = cateClass.getDeclaredConstructor(String.class,String.class);
        Constructor<Cate> constructor = cateClass.getDeclaredConstructor(String.class,String.class,Boolean.class);

        System.out.println(constructor);
    }



    @Test
    public void test4() throws NoSuchMethodException {
        // 获取字节码对象
        Class<Cate> cateClass = Cate.class;

        // 获取这个类的所有的构造方法(public修饰)
//        Constructor<?>[] constructors = cateClass.getConstructors();

        // 获取这个类的所有的构造方法(包括所有的权限修饰符)
        Constructor<?>[] constructors = cateClass.getDeclaredConstructors();

        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }

    }

}
